TimesTenデータ・ストアにDSNを作成する方法の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』を参照してください。作成するDSNのタイプは、アプリケーションでデータ・ストアに直接接続するか、クライアント接続によって接続するかによって異なります。データ・ストアに直接接続する場合は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のUNIXでのDSNの作成またはWindowsでのDSNの作成に関する項を参照してください。データ・ストアにクライアント接続する場合は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のWindowsでのクライアントDSNの作成および設定またはUNIXでのクライアントDSNの作成および設定に関する項を参照してください。
データ・ストアに接続するには、ODBC機能のSQLConnectまたはSQLDriverConnectをコールします。データ・ストアから切断するには、ODBC機能のSQLDisconnectをコールします。これらの機能の詳細は、『Microsoft ODBC Programmer's Reference and SDK Guide』を参照してください。
例1.1のコード・フラグメントでは、SQLConnectおよびSQLDisconnectを起動して、FixedDsというデータ・ストアに対する接続および切断を行います。アプリケーションではじめてSQLConnectを起動すると、データ・ストアFixedDsが作成されます。その後SQLConnectを起動すると、既存のデータ・ストアに接続されます。
#include <sql.h> SQLRETURN retcode; SQLHDBC hdbc; ...; retcode = SQLConnect(hdbc, (SQLCHAR*)"FixedDs", SQL_NTS, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS); ...; retcode = SQLDisconnect(hdbc); ...;
この例には、データ・ストアを作成し、データ・ストアに対して接続および切断を行う完全なプログラムが含まれています。この例では、SQLConnectではなく、SQLDriverConnectを使用して接続を設定します。また、エラー・メッセージの取得方法についても示します。
#ifdef WIN32 #include <windows.h> #else #include <sqlunix.h> #endif #include <sql.h> #include <sqlext.h> #include <stdio.h> #include <string.h> #include <stdlib.h> void CheckReturnCode(SQLRETURN rc, SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt, char* msg, char *filename, int lineno); void main( void ) { SQLRETURN rc = SQL_SUCCESS; /* General return code for the API */ SQLHENV hEnv = SQL_NULL_HENV; /* Environment handle */ SQLHDBC hDbc = SQL_NULL_HDBC; /* Connection handle */ SQLHSTMT hStmt = SQL_NULL_HSTMT; /* Statement handle */ SQLCHAR ConnOut[255]; /* Buffer for completed connection string */ SQLSMALLINT connOutLen; /* number of bytes returned in ConnOut */ SQLCHAR *ConnString = (SQLCHAR *) "DSN=OperationalDS;PermSize=1;" /* Connection attributes */ rc = SQLAllocEnv(&hEnv); if (rc != SQL_SUCCESS) { fprintf(stderr,"Unable to allocate an " "environment handle\n"); exit(1); } rc = SQLAllocConnect(hEnv, &hDbc); CheckReturnCode(rc, hEnv, SQL_NULL_HDBC, SQL_NULL_HSTMT, "Unable to allocate a " "connection handle\n", __FILE__, __LINE__); rc = SQLDriverConnect(hDbc, NULL, ConnString, SQL_NTS, ConnOut, 255, &connOutLen, SQL_DRIVER_NOPROMPT); CheckReturnCode(rc, hEnv, hDbc, SQL_NULL_HSTMT, "Error in connecting to the" " driver\n", __FILE__, __LINE__); rc = SQLAllocStmt(hDbc, &hStmt); CheckReturnCode(rc, hEnv, hDbc, SQL_NULL_HSTMT, "Unable to allocate a " "statement handle\n", __FILE__,__LINE__); /* Your application code here */ if (hStmt != SQL_NULL_HSTMT) { rc = SQLFreeStmt(hStmt, SQL_DROP); CheckReturnCode(rc, hEnv, hDbc, hStmt, "Unable to free the " "statement handle\n", __FILE__, __LINE__); } if (hDbc != SQL_NULL_HDBC) { rc = SQLDisconnect(hDbc); CheckReturnCode(rc, hEnv, hDbc, SQL_NULL_HSTMT, "Unable to close the " "connection\n", __FILE__, __LINE__); rc = SQLFreeConnect(hDbc); CheckReturnCode(rc, hEnv, hDbc, SQL_NULL_HSTMT, "Unable to free the " "connection handle\n", __FILE__, __LINE__); } if (hEnv != SQL_NULL_HENV) { rc = SQLFreeEnv(hEnv); CheckReturnCode(rc, hEnv, SQL_NULL_HDBC, SQL_NULL_HSTMT, "Unable to free the " "environment handle\n", __FILE__, __LINE__); } } void CheckReturnCode(SQLRETURN rc, SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt, char* msg, char *filename, int lineno) { #define MSG_LNG 512 SQLCHAR szSqlState[MSG_LNG]; /* SQL state string */ SQLINTEGER pfNativeError; /* Native error code */ SQLCHAR szErrorMsg[MSG_LNG]; /* Error msg text buffer pointer */ SQLSMALLINT pcbErrorMsg; /* Error msg text Available bytes */ SQLRETURN ret = SQL_SUCCESS; if (rc != SQL_SUCCESS && rc != SQL_NO_DATA_FOUND ) { if (rc != SQL_SUCCESS_WITH_INFO) { /* * It's not just a warning */ fprintf(stderr, "*** ERROR in %s, line %d:" " %s\n", filename, lineno, msg); } /* * Now see why the error/warning occurred */ while (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { ret = SQLError(henv, hdbc, hstmt, szSqlState, &pfNativeError, szErrorMsg, MSG_LNG, &pcbErrorMsg); switch (ret) { case SQL_SUCCESS: fprintf(stderr, "*** %s\n" "*** ODBC Error/Warning = %s, " "TimesTen Error/Warning " " = %d\n", szErrorMsg, szSqlState, pfNativeError); break; case SQL_SUCCESS_WITH_INFO: fprintf(stderr, "*** Call to SQLError" " failed with return code of " "SQL_SUCCESS_WITH_INFO.\n " "*** Need to increase size of" " message buffer.\n"); break; case SQL_INVALID_HANDLE: fprintf(stderr, "*** Call to SQLError" " failed with return code of " "SQL_INVALID_HANDLE.\n"); break; case SQL_ERROR: fprintf(stderr, "*** Call to SQLError" " failed with return code of " "SQL_ERROR.\n"); break; case SQL_NO_DATA_FOUND: break; } /* switch */ } /* while */ };
データ・ストアへの接続時に接続文字列を指定して、プログラムで接続属性を設定または上書きできます。
BulkInsDataというデータ・ストアに接続し、デフォルトの行レベル・ロックではなくデータ・ストア・レベル・ロックがアプリケーションで使用されるように指定するには、次のコード・フラグメントに示すように、アプリケーションでSQLDriverConnectルーチンを使用します。 SQLHDBC hdbc; SQLCHAR ConnStrOut[512]; SQLSMALLINT cbConnStrOut; SQLRETURN rc; rc = SQLDriverConnect(hdbc, NULL, "DSN=BulkInsData;LockLevel=1", SQL_NTS, ConnStrOut, sizeof (ConnStrOut), &cbConnStrOut, SQL_DRIVER_NOPROMPT);